import { install } from './onInstalled';
import { getPort } from './connect';
import { onInputChangedFn, onInputEnteredFn, onInputStartedFn, onInputCancelledFn } from './omnibox/';
import { onActivated, onCreated, onDetached, onAttached, onMoved, onRemoved, onReplaced, onUpdated, onHighlighted, getThisTab } from './tab';
import { sendMessageTabs } from '../../utils/message';
chrome.runtime.onInstalled.addListener(install);//插件初始化时的安装函数

chrome.runtime.onConnect.addListener(getPort);//获取监听的端口号和对应的处理函数

chrome.runtime.onMessage.addListener(async function (request, sender, sendResponse) {
    console.log('收到来自content-script的消息：');
    console.log(request, sender, sendResponse);
    sendResponse('我是后台，我已收到你的消息：' + JSON.stringify(request));

    let tab = await getThisTab();
    console.log(tab)
    if (tab && tab.id) {
        await sendMessageTabs(tab.id, { name: '我是背景页面的测试' });
    }

});//一次性消息监听

chrome.omnibox.onInputStarted.addListener(onInputStartedFn);//开始输入
chrome.omnibox.onInputChanged.addListener(onInputChangedFn);//输入变化
chrome.omnibox.onInputEntered.addListener(onInputEnteredFn);//执行指令
chrome.omnibox.onInputCancelled.addListener(onInputCancelledFn);//取消输入行为

/**
 * 这里开始是网络部分的API监听事件一览 https://www.ituring.com.cn/book/miniarticle/72769
 * Web请求API保证针对每个请求将onCompleted或onErrorOccurred作为最终事件触发，但有一个例外：如果将请求重定向到data://URL，onBeforeRedirect则是最后报告的事件。
 * 从Chrome 79开始，未提供以下请求标头，并且如果未在中指定'extraHeaders'，则无法对其进行修改或删除。注意：指定'extraHeaders'inopt_extraInfoSpec可能会对性能产生负面影响，因此仅应在确实必要时使用。
 * 参考文档：https://developer.chrome.com/docs/extensions/reference/webRequest/
 * chrome.webRequest.onBeforeRequest.addListener(details => {
    console.log(details)
}, {
    types: ['image'],
    urls: [
        "*://www.baidu.com/*"
    ]
}, ['extraHeaders']);
 * 以下事件的监听按照网络顺序来执行
*/

chrome.webRequest.onBeforeRequest;//在即将发生请求时触发。在建立任何TCP连接之前发送此事件，该事件可用于取消或重定向请求。
chrome.webRequest.onBeforeSendHeaders;//当请求即将发生且初始标头已准备好时触发。该事件旨在允许扩展添加，修改和删除请求标头（*）。该onBeforeSendHeaders事件将传递给所有订阅者，因此不同的订阅者可能会尝试修改请求；此事件可用于取消请求。
chrome.webRequest.onSendHeaders;//在所有扩展都有机会修改请求标头并显示最终（*）版本后触发。在将标头发送到网络之前触发事件。此事件是信息性的，并且是异步处理的。它不允许修改或取消请求。
chrome.webRequest.onHeadersReceived;//每次收到HTTP（S）响应标头时触发。由于重定向和身份验证请求，每个请求可能会多次发生。此事件旨在允许扩展添加，修改和删除响应标头，例如传入的Content-Type标头。在触发此事件之前会处理缓存指令，因此，修改标头（例如Cache-Control）不会影响浏览器的缓存。它还允许您取消或重定向请求。
chrome.webRequest.onAuthRequired;//当请求要求用户认证时触发。可以同步处理此事件以提供身份验证凭据。请注意，扩展名可能会提供无效的凭据。请注意不要通过反复提供无效的凭据来进入无限循环。这也可以用于取消请求。
chrome.webRequest.onBeforeRedirect;//当将要执行重定向时触发。重定向可以由HTTP响应代码或扩展名触发。此事件是信息性的，并且是异步处理的。它不允许您修改或取消请求。
chrome.webRequest.onResponseStarted;//当接收到响应主体的第一个字节时触发。对于HTTP请求，这意味着状态行和响应标头均可用。此事件是信息性的，并且是异步处理的。它不允许修改或取消请求。
chrome.webRequest.onCompleted;//成功处理请求后触发。
chrome.webRequest.onErrorOccurred//当无法成功处理请求时触发。

// 下面是关于tabs的监听事件  https://www.ituring.com.cn/book/miniarticle/66275
// chrome.tabs.onCreated.addListener(onCreated);
// chrome.tabs.onUpdated.addListener(onUpdated);
// chrome.tabs.onMoved.addListener(onMoved);
// chrome.tabs.onActivated.addListener(onActivated);
// chrome.tabs.onHighlighted.addListener(onHighlighted);
// chrome.tabs.onDetached.addListener(onDetached);
// chrome.tabs.onAttached.addListener(onAttached);
// chrome.tabs.onRemoved.addListener(onRemoved);
// chrome.tabs.onReplaced.addListener(onReplaced);